package com.sxj.corejava.code05_反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/19日 20:29
 */
public class Test03_操作构造器 {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class c = User.class;
        // 1.获取当前类中所有public修饰的构造方法
        Constructor[] constructors = c.getConstructors();
        System.out.println(Arrays.toString(constructors));

        // 2.根据传递的参数不同,返回public修饰的指定参数的构造方法
        Constructor constructor = c.getConstructor();
        System.out.println(constructor);
        Constructor constructor2 = c.getConstructor(String.class, String.class);
        System.out.println(constructor2);
//        Constructor constructor3 = c.getConstructor(String.class);
//        System.out.println(constructor3);

        // 3.获取当前类中所有构造方法
        constructors = c.getDeclaredConstructors();
        System.out.println(Arrays.toString(constructors));

        // 4.获取当前类中指定参数的构造方法
        constructor = c.getDeclaredConstructor();
        System.out.println(constructor);
        constructor2 = c.getDeclaredConstructor(String.class, String.class);
        System.out.println(constructor2);
        Constructor constructor3 = c.getDeclaredConstructor(String.class);
        System.out.println(constructor3);

        // 通过反射调用指定构造方法来创建对象
        User user = (User) constructor.newInstance();
        System.out.println(user);
        User user2 = (User) constructor2.newInstance("admin", "123456");
        System.out.println(user2);

        // 对于private修饰的构造方法,默认是不允许外部访问的
        // 如果想要访问,可以通过反射破坏原有的封装原则,使得private修饰符失效即可
        constructor3.setAccessible(true);
        User user3 = (User) constructor3.newInstance("admin");
        System.out.println(user3);
    }

}
